import axios from "axios";

// 允许跨域请求时携带凭证(如cookies,headers)
axios.defaults.withCredentials = true;

// 创建axios实例
const instance = axios.create({
  baseURL: process.env.VITE_BASE_URL || '',
  timeout: 5000,
  withCredentials: true
})

// 请求拦截器
instance.interceptors.request.use(
  config => {
    // do something
    return config
  },
  error => {
    console.error('请求出错', error)
    return Promise.reject(error)
  })

// 响应拦截器 此拦截器在响应到达时执行，如果响应状态码是4xx或5xx 则返回一个被拒绝的promise，携带状态文本作为错误信息
instance.interceptors.response.use(
  response => {
    if (/^[4|5]/.test(response.status)) {
      return Promise.reject(response.statusText)
    }
    return response
  },
  error => {
    console.error('请求出错', error)
    return Promise.reject(error)
  })


const defaultMethod = {
  OPTIONS: "OPTIONS",
  GET: "GET",
  HEAD: "HEAD",
  POST: "POST",
  PUT: "PUT",
  DELETE: "DELETE",
  TRACE: "TRACE",
  CONNECT: "CONNECT"
}


/** 
 * 发起网络请求的函数 
 * @param {string} url - 请求的URL地址 
 * @param {Object} [data={}] - 请求的配置和数据对象，可以包含responseType, headers, params等属性 
 * @param {string} [data.responseType='json'] - 响应的数据类型，默认为'json' 
 * @param {Object} [data.headers={'content-type': 'application/json'}] - 请求头对象，默认为 {'content-type': 'application/json'} 
 * @param {Object} [data.params] - 请求的查询参数对象，将被添加到URL的查询字符串中 
 * @param {string} [method='GET'] - 请求的方法，如'GET', 'POST'等，默认值为'GET' 
 * @param {Object} [pd={}] - 额外的请求配置对象，用于覆盖data中的配置 
 * @returns {Promise<Object|any>} - 返回一个Promise，解析为请求的数据或错误对象 
*/
export default async function (url, data = {}, method = "GET", pd) {
  method = defaultMethod[method.toUpperCase()] || "GET"
  const { responseType = 'json', headers = { 'content-type': 'application/json' }, params } = data
  const requestObj = { url, method, headers, responseType, ...data, ...pd }

  try {
    const response = await instance.request(requestObj)
    return response.data
  }
  catch (err) {
    console.log(err)
    return {
      code: -1,
      data: {},
      errors: [err.message || err]
    }
  }
}